// Agent chef in project restaurant.mas2j


/* Initial beliefs and rules */


/* Initial goals */

!start.

/* Plans */

+!start : true <- 	enregistreCuisinier(0).


//CHEFS

//Essaye d'attribuer a un cuisinier specialiste


+cuisineirDisponible(Cuisinier,Chef) : selfCuisinier(Chef) & dessert(Commande,Plat,PositionTable,enAttente,Serveur) & specialite(Cuisinier, dessert)& toutLesPlatsPrets(Commande,plat)
<-.send(Cuisinier,tell,recuAttribuition(Cuisinier,Plat,Chef,Commande,PositionTable));
+attribuition(Cuisinier,Plat,Chef,Commande,PositionTable);
-dessert(Commande,Plat,PositionTable,enAttente,Serveur);
+dessert(Commande,Plat,PositionTable,enPreparation,Serveur);
-cuisineirDisponible(Cuisinier,Chef).

+cuisineirDisponible(Cuisinier,Chef) : selfCuisinier(Chef) & entree(Commande,Plat,PositionTable,enAttente,Serveur) & specialite(Cuisinier, entree)<-
.send(Cuisinier,tell,recuAttribuition(Cuisinier,Plat,Chef,Commande,PositionTable));
+attribuition(Cuisinier,Plat,Chef,Commande,PositionTable);
-entree(Commande,Plat,PositionTable,enAttente,Serveur);
+entree(Commande,Plat,PositionTable,enPreparation,Serveur);
-cuisineirDisponible(Cuisinier,Chef).	


+cuisineirDisponible(Cuisinier,Chef) : selfCuisinier(Chef) & plat(Commande,Plat,PositionTable,enAttente,Serveur) & specialite(Cuisinier, plat)&toutLesPlatsPrets(Commande,entree)<-
.send(Cuisinier,tell,recuAttribuition(Cuisinier,Plat,Chef,Commande,PositionTable));
+attribuition(Cuisinier,Plat,Chef,Commande,PositionTable);
-plat(Commande,Plat,PositionTable,enAttente,Serveur);
+plat(Commande,Plat,PositionTable,enPreparation,Serveur);
-cuisineirDisponible(Cuisinier,Chef).	


//sinon, attribue a quelqu'un												
+cuisineirDisponible(Cuisinier,Chef) : selfCuisinier(Chef) & dessert(Commande,Plat,PositionTable,enAttente,Serveur)&toutLesPlatsPrets(Commande,plat) <-
.send(Cuisinier,tell,recuAttribuition(Cuisinier,Plat,Chef,Commande,PositionTable));
+attribuition(Cuisinier,Plat,Chef,Commande,PositionTable);
-dessert(Commande,Plat,PositionTable,enAttente,Serveur);
+dessert(Commande,Plat,PositionTable,enPreparation,Serveur);
-cuisineirDisponible(Cuisinier,Chef).

+cuisineirDisponible(Cuisinier,Chef) : selfCuisinier(Chef) & entree(Commande,Plat,PositionTable,enAttente,Serveur)<-
.send(Cuisinier,tell,recuAttribuition(Cuisinier,Plat,Chef,Commande,PositionTable));
+attribuition(Cuisinier,Plat,Chef,Commande,PositionTable);
-entree(Commande,Plat,PositionTable,enAttente,Serveur);
+entree(Commande,Plat,PositionTable,enPreparation,Serveur);
-cuisineirDisponible(Cuisinier,Chef).	


+cuisineirDisponible(Cuisinier,Chef) : selfCuisinier(Chef) & plat(Commande,Plat,PositionTable,enAttente,Serveur)&toutLesPlatsPrets(Commande,entree)<-
.send(Cuisinier,tell,recuAttribuition(Cuisinier,Plat,Chef,Commande,PositionTable));
+attribuition(Cuisinier,Plat,Chef,Commande,PositionTable);
-plat(Commande,Plat,PositionTable,enAttente,Serveur);
+plat(Commande,Plat,PositionTable,enPreparation,Serveur);
-cuisineirDisponible(Cuisinier,Chef).																							




//commandeAPreparer(X) recu des serveurs par 'tell': plat, dessert ou entree

//Le chef va recevoir les descriptions des commandes des serveurs et va passer PLAT aux cuisiniers
+entree(Commande,Plat,PositionTable,enCours,Serveur): selfCuisinier(Chef) & copain(Chef, Cuisinier) & specialite(Cuisinier, entree)<-
.send(Cuisinier,tell,recuAttribuition(Cuisinier,Plat,entree,Chef,Commande,PositionTable));
.print("Le chef ",Chef," attribue une entree de la commande ",Commande," au cuisinier ",Cuisinier);
+attribuition(Cuisinier,Plat,Chef,Commande,PositionTable);
-entree(Commande,Plat,PositionTable,enCours,Serveur)[source(Serveur)];
+entree(Commande,Plat,PositionTable,enPreparation,Serveur).

+dessert(Commande,Plat,PositionTable,enCours,Serveur) : selfCuisinier(Chef) & copain(Chef, Cuisinier) & specialite(Cuisinier, dessert)<- 
.send(Cuisinier,tell,recuAttribuition(Cuisinier,Plat,dessert,Chef,Commande,PositionTable));
.print("Le chef ",Chef," attribue un dessert de la commande ",Commande," au cuisinier ",Cuisinier);	
+attribuition(Cuisinier,Plat,Chef,Commande,PositionTable);
-dessert(Commande,Plat,PositionTable,enCours,Serveur)[source(Serveur)];
+dessert(Commande,Plat,PositionTable,enPreparation,Serveur).

+plat(Commande,Plat,PositionTable,enCours,Serveur) : selfCuisinier(Chef) & copain(Chef, Cuisinier)  & specialite(Cuisinier, plat)
<- .send(Cuisinier,tell,recuAttribuition(Cuisinier,Plat,plat,Chef,Commande,PositionTable));
.print("Le chef ",Chef," attribue un plat de la commande ",Commande," au cuisinier ",Cuisinier);	
+attribuition(Cuisinier,Plat,Chef,Commande,PositionTable);
-plat(Commande,Plat,PositionTable,enCours,Serveur)[source(Serveur)];
+plat(Commande,Plat,PositionTable,enPreparation,Serveur).


//Si un cuisinier a change d'attribuition avec l'autre pour l'aider.																						
+nouvelleAttribuition(Plat,Copain,Cuisinier,Commande,PositionTable) : attribuition(Cuisinier,Plat,Chef,Commande,PositionTable) & selfCuisinier(Chef)  <-
-attribuition(Cuisinier,Plat,Chef,Commande,PositionTable);
+attribuition(Copain,Plat,Chef,Commande,PositionTable);
.print("Le Chef ",Chef," a pris connaissance de l'echange de",Copain," et ", Cuisinier).

+attribuitionAnnullee(Plat,Cuisinier,Chef,Commande,PositionTable) : attribuition(Cuisinier,Plat,Chef,Commande,PositionTable) & selfCuisinier(Chef) & plat(Commande,Plat,PositionTable,enCours,Serveur) <- 
-plat(Commande,Plat,PositionTable,enPreparation,Serveur); 
+plat(Commande,Plat,PositionTable,enAttente,Serveur) ;
-attribuition(Cuisinier,Plat,Chef,Commande,PositionTable).

+!appelServeur(Commande,Plat,PositionTable,Serveur,Cuisinier) :selfCuisinier(Chef) & 	plat(Commande,Plat,PositionTable,fini,Serveur) & 
plat(Commande,Plat,PositionTable,enPreparation,Serveur) <-
.send(Serveur,tell,plat(Commande,Plat,PositionTable,pret,Cuisinier));	
-plat(Commande,Plat,PositionTable,fini,Serveur);
.print("Le Chef ",Chef," a appelle le serveur ",Serveur," pour ammenner le plat  ",Plat, " de la commande ", Commande).

+attribuitionAnnullee(Plat,Cuisinier,Chef,Commande,PositionTable) : attribuition(Cuisinier,Plat,Chef,Commande,PositionTable) & selfCuisinier(Chef) & entree(Commande,Plat,PositionTable,enCours,Serveur) <- 
-entree(Commande,Plat,PositionTable,enPreparation,Serveur); 
+entree(Commande,Plat,PositionTable,enAttente,Serveur) ;
-attribuition(Cuisinier,Plat,Chef,Commande,PositionTable).																															//!trouverCuisinierDisponible(Plat,Chef,Commande).

+attribuitionAnnullee(Plat,Cuisinier,Chef,Commande,PositionTable) : attribuition(Cuisinier,Plat,Chef,Commande,PositionTable) & selfCuisinier(Chef) & dessert(Commande,Plat,PositionTable,enCours,Serveur) <- 
-dessert(Commande,Plat,PositionTable,enPreparation,Serveur) ;
+dessert(Commande,Plat,PositionTable,enAttente,Serveur) ;
-attribuition(Cuisinier,Plat,Chef,Commande,PositionTable).																															

+platFini(Cuisinier,Plat,Chef,Commande,PositionTable) : selfCuisinier(Chef) &	attribuition(Cuisinier,Plat,Chef,Commande,PositionTable) & plat(Commande,Plat,PositionTable,enPreparation,Serveur) <- 
-attribuition(Cuisinier,Plat,Chef,Commande,PositionTable);
-plat(Commande,Plat,PositionTable,enPreparation,Serveur);
-platFini(Cuisinier,Plat,Chef,Commande,PositionTable);
+plat(Commande,Plat,PositionTable,fini,Serveur);
!appelServeur(Commande,Plat,PositionTable,Serveur,Cuisinier).

+platFini(Cuisinier,Plat,Chef,Commande,PositionTable) : selfCuisinier(Chef) &	attribuition(Cuisinier,Plat,Chef,Commande,PositionTable) & entree(Commande,Plat,PositionTable,enPreparation,Serveur) <- 
-attribuition(Cuisinier,Plat,Chef,Commande,PositionTable);
-entree(Commande,Plat,PositionTable,enPreparation,Serveur);
-platFini(Cuisinier,Plat,Chef,Commande,PositionTable);
+entree(Commande,Plat,PositionTable,fini,Serveur);
!appelServeur(Commande,Plat,PositionTable,Serveur,Cuisinier).																							

+platFini(Cuisinier,Plat,Chef,Commande,PositionTable) : selfCuisinier(Chef) &	attribuition(Cuisinier,Plat,Chef,Commande,PositionTable) & dessert(Commande,Plat,PositionTable,enPreparation,Serveur) <- 
-attribuition(Cuisinier,Plat,Chef,Commande,PositionTable);
-dessert(Commande,Plat,PositionTable,enPreparation,Serveur);
-platFini(Cuisinier,Plat,Chef,Commande,PositionTable);
+dessert(Commande,Plat,PositionTable,fini,Serveur);
!appelServeur(Commande,Plat,PositionTable,Serveur,Cuisinier).																															

+!appelServeur(Commande,Plat,PositionTable,Serveur,Cuisinier) : selfCuisinier(Chef) & 	plat(Commande,Plat,PositionTable,fini,Serveur) &
plat(Commande,Plat,PositionTable,enPreparation,Serveur)<-
.send(Serveur,tell,entree(Commande,Plat,PositionTable,pret,Cuisinier));	
-plat(Commande,Plat,PositionTable,fini,Serveur);
.print("Le Chef ",Chef," a appelle le serveur ",Serveur," pour ammenner le plat  ",Plat, " de la commande ", Commande).

+!appelServeur(Commande,Plat,PositionTable,Serveur,Cuisinier) :selfCuisinier(Chef) & 	plat(Commande,Plat,PositionTable,fini,Serveur) & 
not plat(Commande,Plat,PositionTable,enPreparation,Serveur) <-
.send(Serveur,tell,plat(Commande,Plat,PositionTable,pret,Cuisinier));
.send(Serveur,tell,tousPlats(Commande,pret));
-plat(Commande,Plat,PositionTable,fini,Serveur);
.print("Le Chef ",Chef," a appelle le serveur ",Serveur," pour ammenner toutes les plats  de la commande ", Commande);
+toutLesPlatsPrets(Commande,plat).

+!appelServeur(Commande,Plat,PositionTable,Serveur,Cuisinier) : selfCuisinier(Chef) & 	entree(Commande,Plat,PositionTable,fini,Serveur) &
entree(Commande,Plat,PositionTable,enPreparation,Serveur)<-
.send(Serveur,tell,entree(Commande,Plat,PositionTable,pret,Cuisinier));	
-entree(Commande,Plat,PositionTable,fini,Serveur);
.print("Le Chef ",Chef," a appelle le serveur ",Serveur," pour ammenner l'entree  ",Plat, " de la commande ", Commande).


+!appelServeur(Commande,Plat,PositionTable,Serveur,Cuisinier) : selfCuisinier(Chef) & 	entree(Commande,Plat,PositionTable,fini,Serveur) &
not entree(Commande,Plat,PositionTable,enPreparation,Serveur)<-
.send(Serveur,tell,entree(Commande,Plat,PositionTable,pret,Cuisinier));	
.send(Serveur,tell,tousEntrees(Commande,pret));
-entree(Commande,Plat,PositionTable,fini,Serveur);
.print("Le Chef ",Chef," a appelle le serveur ",Serveur," pour ammenner toutes les entrees  de la commande ", Commande);
+toutLesPlatsPrets(Commande,entree).

+!appelServeur(Commande,Plat,PositionTable,Serveur,Cuisinier): selfCuisinier(Chef) & 	dessert(Commande,Plat,PositionTable,fini,Serveur) &
dessert(Commande,Plat,PositionTable,enPreparation,Serveur) <-
.send(Serveur,tell,dessert(Commande,Plat,PositionTable,pret,Cuisinier));
-dessert(Commande,Plat,PositionTable,fini,Serveur);
.print("Le Chef ",Chef," a appelle le serveur ",Serveur," pour ammenner le dessert  ",Plat, " de la commande ", Commande).																																


+!appelServeur(Commande,Plat,PositionTable,Serveur,Cuisinier): selfCuisinier(Chef) & 	dessert(Commande,Plat,PositionTable,fini,Serveur) &
not dessert(Commande,Plat,PositionTable,enPreparation,Serveur) <-
.send(Serveur,tell,dessert(Commande,Plat,PositionTable,pret,Cuisinier));	
.send(Serveur,tell,tousDesserts(Commande,pret));
-dessert(Commande,Plat,PositionTable,fini,Serveur);
.print("Le Chef ",Chef," a appelle le serveur ",Serveur," pour ammenner tous les desserts  de la commande ", Commande);
+toutLesPlatsPrets(Commande,dessert).



